package main

import (
	"fmt"
	"log"
	"os"
	"os/exec"
	"strings"
	"time"
)

// 设置间隔时间（单位：秒）
const interval = 60 // 1小时 = 3600秒
const killInterval = 3600 * 2

// 设置 Electron 应用的名称（进程名），根据实际进程名修改
const electronProcessName = "Untitled" // 根据实际的进程名修改

// 设置 Electron 应用的启动路径
const electronAppPath = "C:\\Users\\Administrator\\Desktop\\storage\\Untitled 1.0.0.exe" // 替换为你的 Electron 应用路径

// 清理文件夹
func clearDir() {
	if err := os.RemoveAll(`C:\Users\Administrator\AppData\Roaming\Untitled\Partitions`); err != nil {
		log.Println("RemoveAll error:", err)
	} else {
		log.Println("folder deleted")
	}
}
func findElectronProcess() (bool, bool) {
	// 执行 tasklist 命令，检查是否有运行中的 Electron 应用进程
	cmd := exec.Command("tasklist", "/FI", fmt.Sprintf("IMAGENAME eq %s.exe", electronProcessName), "/V")
	output, err := cmd.Output()
	if err != nil {
		return false, false
	}
	// fmt.Println(string(output))
	// 如果输出中包含 Electron 应用进程，则说明进程正在运行 OleMainThreadWndName DashBoard
	extis := strings.Contains(string(output), electronProcessName) && strings.Contains(string(output), "Running")
	isNotResponding := strings.Contains(string(output), "Responding")
	return extis, isNotResponding
}

// 检查并杀掉进程
func killElectronProcess() error {
	// "/F",
	killCmd := exec.Command("taskkill", "/IM", fmt.Sprintf("%s.exe", electronProcessName))
	killOutput, err := killCmd.CombinedOutput()
	if err != nil {
		return fmt.Errorf("杀掉进程失败: %v, 输出: %s", err, killOutput)
	}
	fmt.Println("Electron 进程已终止")
	return nil
}

// 启动 Electron 应用
func startElectronApp() error {
	clearDir()
	cmd := exec.Command(electronAppPath)
	err := cmd.Start()
	if err != nil {
		return fmt.Errorf("启动 Electron 应用失败: %v", err)
	}
	fmt.Println("Electron 应用已启动...")
	return nil
}

func main() {
	startTime := time.Now()
	for {
		exists, isNotResponding := findElectronProcess()
		startsec := time.Now().Sub(startTime).Milliseconds() / 1e3
		if isNotResponding {
			_ = killElectronProcess()
			log.Println("isNotResponding 结束后重启")
			continue
		}
		// 如果在跑, 判断有没有超过一个小时, 超过就重启
		if exists && startsec > killInterval {
			_ = killElectronProcess()
			log.Println("正在运行, 时间超过", killInterval, "秒, 结束后重启")
			continue
		}
		// 不存在 直接重启
		if !exists {
			log.Println("不存在", electronProcessName, " 直接启动")
			// 启动 Electron 应用
			_ = startElectronApp()
			time.Sleep(time.Duration(interval) * time.Second)
			log.Println("等待", interval, "秒 运行")
			startTime = time.Now() // 重新计时
			continue
		}
		// 30秒检查一次
		time.Sleep(time.Duration(interval) * time.Second)
		fmt.Println(interval, "秒一次检查, 当前运行: ", startsec, "秒,exists: ", exists, ",isNotResponding: ", isNotResponding)
	}
}
